/*
背景：
你是一名室内装潢工程队的配料员。你的伙伴们喜欢采用“之”字型的方式铺大理石地砖，图案如下：
1	2	6	7	15
3	5	8	14	16
4	9	13	17	22
10	12	18	21	23
11	19	20	24	25
学了 C 语言以后，你决定编写一个程序，帮助你的同伴生成这样的图形。

输入：
方阵N的大小。

输出
方阵。
*/

/*
测试用例1:
输入：
5↵
输出：
1  2  6  7  15↵
3  5  8  14 16↵
4  9  13 17 22↵
10 12 18 21 23↵
11 19 20 24 25↵

测试用例2:
输入：
3↵
输出：
1  2  6↵
3  5  7↵
4  8  9↵

测试用例3:
输入：
9↵
输出：
1  2  6  7  15 16 28 29 45↵
3  5  8  14 17 27 30 44 46↵
4  9  13 18 26 31 43 47 60↵
10 12 19 25 32 42 48 59 61↵
11 20 24 33 41 49 58 62 71↵
21 23 34 40 50 57 63 70 72↵
22 35 39 51 56 64 69 73 78↵
36 38 52 55 65 68 74 77 79↵
37 53 54 66 67 75 76 80 81↵
*/

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	
	// 接收用户输入
	int N;
	cin >> N;
	
	// 构建矩阵
	vector<vector<int>> matrix(N, vector<int>(N));
	int num = 1;
	for (int i=0,j=0;;)
	{
		matrix[i][j] = num;
		num++;
		
		// 考虑向左下方移动
		if (i < N-1 && j > 0)
		{
			if (matrix[i+1][j-1] == 0)
			{
				i++, j--;
				continue;
			}
		}
		
		// 考虑右上方移动
		if (i > 0 && j < N-1)
		{
			if (matrix[i-1][j+1] == 0)
			{
				i--, j++;
				continue;
			}
		}
		
		// 考虑向左移动
		if ((i == 0 || i == N-1) && j < N-1)
		{
			if (matrix[i][j+1] == 0)
			{
				j++;
				continue;
			}
		}
		
		// 考虑向下移动
		if ((j == 0 || j == N-1) && i < N-1)
		{
			if (matrix[i+1][j] == 0)
			{
				i++;
				continue;
			}
		}
		
		// 结束
		if (i == N-1 && j == N-1)
			break;

	}
	
	// 打印结果
	for (int i=0; i<N; i++)
	{
		for (int j=0; j<N; j++)
		{
			cout << matrix[i][j];
			
			if (j != N)
				cout << "\t";
		}
		cout << endl;
	}
		
}